/**
 * 协议指令定义
 * 跑得快的主协议：10001
 * 玩法子协议：1000-1999范围
 * 大厅子协议：2000-2999范围
 * 网络协议：3000-3999
 * SDK协议：4000-4999
 * Error协议：5000-5999
 * 通用协议：6000-6999 （包含更新金币等）
 */
export const ProtocolStr = {
    ProxyServerId:  'c4ca4238a0b923820dcc509a6f75849b',
    BattleServerId: 'eccbc87e4b5ce2fe28308fd9f2a7baf3',
    GMServerId:     'a87ff679a2f3e71d9181a67b7542122c',
    DBServerId:     'e4da3b7fbbce2345d7772b0674a318d5',
    CenterServerId: '1679091c5a880faf6fb5e6087eb1b2dc',
};

export const GameSvrsID = {
    RunFast:'b6d767d2f8ed5d21a44b0e5886680cb9',
    DDZ:'b6d767d2f8ed5d21a44b0e5886680cb9'//'016cd545b92ce7e02528844ac39dd91d'
};

// 代理
export enum ProtocolProxy{
    INIYPROXY             = 0,       //  ==0
    C2Proxy_SendDataProto = 1,       //  C2Proxy_SendDataProto == 1  客户端发送协议
    Proxy2C_SendDataProto = 2 ,      //  Proxy2C_SendDataProto == 2
    G2Proxy_ConnDataProto = 3 ,      //  G2Proxy_ConnDataProto == 3  服务器链接协议
    Proxy2G_ConnDataProto = 4 ,      //  Proxy2G_ConnDataProto == 4
    G2Proxy_SendDataProto = 5 ,      //  G2Proxy_SendDataProto == 5  服务器发送代理
    Proxy2G_SendDataProto = 6 ,      //  Proxy2G_SendDataProto == 6
    C2Proxy_ConnDataProto = 7 ,      //  C2Proxy_ConnDataProto == 7  客户端连接协议
    Proxy2C_ConnDataProto = 8 ,      //  Proxy2C_ConnDataProto == 8
}

// 网络层主协议 
export enum ProtocolNet {
    GameNet_Proto = 3,
    Net_HeartBeatProto = 1,         //  心跳协议
	Net_RelinkProto = 2,            //  断线重连,主动推送，玩家登陆的时候下发是否在游戏钟
}

export enum ProtocolMain {
    Unknow = -1,                  // 错误的类型
    RunFast_CODE             = 1, // 跑得快主消息号
    DDZ_CODE                 = 1, // 斗地主主消息号
}

export enum ProtocolCmd {
    GS2C_MainMinProto = 10000, // 最小协议
    GS2C_MainHallProto = 10002, // 大厅主协议
    // 个人中心
    C2GS_HallPersonalCenterChangeNameProto2 = 2001, // 个人中心-修改名字
    GS2C_HallPersonalCenterChangeNameProto2 = 2002, // 服务器返回数据

    C2GS_HallPersonalCenterChangeHeadUrlProto2 = 2003, // 个人中心-修改头像
    GS2C_HallPersonalCenterChangeHeadUrlProto2 = 2004, // 服务器返回数据

    // 商城
    C2GS_HallShopConfProto2 = 2005, // 商城-获取配置
    GS2C_HallShopConfProto2 = 2006, // 服务器返回数据--商品列表

    C2GS_HallShopBuyProto2 = 2007, // 商城-购买
    GS2C_HallShopBuyProto2 = 2008, // 服务器返回数据--服务器主动回调推送

    // 转盘小游戏
    C2GS_HallMatkaGameProto2 = 2009, // 小游戏-点击进入
    GS2C_HallMatkaGameProto2 = 2010, // 服务器返回配置数据

    // 点击抽奖
    C2GS_MatkaGameLuckyDrawProto2 = 2011, // 小游戏-点击进入
    GS2C_HallMatkaGameLuckyDrawProto2 = 2012, // 服务器返回数据，中奖数据

    // 七日签到
    C2GS_HallSignInProto2 = 2013, // 进入签到页面
    GS2C_HallSignInProto2 = 2014, // 服务器返回数据，签到数据

    C2GS_HallClickOnSignInProto2 = 2015, // 点击签到
    GS2C_HallClickOnSignInProto2 = 2016, // 服务器返回数据，签到奖励数据

    // 救济金
    C2GS_HallClickOnJiuJiProto2 = 2017, // 点击-救济金页面
    GS2C_HallClickOnJiuJiProto2 = 2018, // 服务器返回数据，倒计时或者赢得奖励

    C2GS_HallClickOnGetJiuJiProto2 = 2019, // 点击-领取救济金
    GS2C_HallClickOnGetJiuJiProto2 = 2020, // 服务器返回数据，签到奖励数据

    // 兑换功能
    C2GS_HallExchangeProto2 = 2021, // 兑换
    GS2C_HallExchangeProto2 = 2022, // 服务器返回数据，兑换数据

	C2GS_EntrGameConifgRoomProto2 = 2025, // 请求房间的配置
	GS2C_EntrGameConifgRoomProto2 = 2026, // 房间的配置

    //---------------------------------------------------------------------
    // 房间内游戏消息区间
    GS2C_MainGameProto = 10001, // 房间内主协议
    C2GS_EntrGameProto2 = 1001, // 进入游戏，---- a，b，c，d 准备游戏状态
    GS2C_EntrGameProto2 = 1002, // 发牌状态 即桌面上所有信息，表示即将开始游戏

    C2GS_PlayerPlayCardsProto2 = 1003, // 玩家出牌
    GS2C_PlayerPlayCardsProto2 = 1004,

    C2GS_PlayerChooseCardsProto2 = 1005, // 玩家选牌
    GS2C_PlayerChooseCardsProto2 = 1006,

    C2GS_PlayerTrusteeShipProto2 = 1007, // 玩家请求托管
    GS2C_PlayerTrusteeShipProto2 = 1008,

    C2GS_PlayerQuitProto2 = 1009, // 玩家退出
    GS2C_PlayerQuitProto2 = 1010,

    GS2C_PlayerSettleProto2 = 1011, // 玩家出牌结束

    GS2C_PublicMainProto = 10003, // 主协议
    C2GS_NetReLinkProto2 = 3001, // 客户端重链接
    GS2C_NetReLinkProto2 = 3002,
    HeartBeatProto2 = 3003, // 心跳协议，服务器+客户端共用
    SysKickingPlayerProto2 = 3004, // 系统踢人协议,客户端接到协议后就自动回到大厅界面

    
    GS2C_MainCommonProto = 10005, // 主协议
	UpdateCoinProto2 = 6001, // 更新金币协议，服务器主动推送
};

/**
 * 协议体定义
 * 向服务器发送网络协议时候不用填写“OpenId”字段，底层自动填写
 */

export declare namespace ProtocolStruct {
    // 心跳协议
    export interface Net_HeartBeat {
        Protocol:number,
        Protocol2:number,
        OpenId:string,
        TimeStamp:number, // 服务器时间戳
    }
    //----------------------------------------------------------------------------------------------------------------------
    // 大厅协议
    // C2GS_HallPersonalCenterChangeNameProto2 == 2001
    export interface C2GS_HallPersonalCenterChangeName {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 用户唯一ID
        NewName: string, // 不可以超过6个字符
    }

    // 返回修改的协议--成功的协议
    // GS2C_HallPersonalCenterChangeNameProto2 = 2002
    export interface GS2C_HallPersonalCenterChangeName {
        Protocol: number,
        Protocol2: number,
        Status: number,// 验证码
    }

    //----------------------------------------------------------------------------------------------------------------------

    // 修改头像
    // C2GS_HallPersonalCenterChangeHeadUrlProto2 == 2003
    export interface C2GS_HallPersonalCenterChangeHeadUrl {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 用户唯一ID
        HeadUrlID: number,// 头像的ID,从1名字开始
    }

    // GS2C_HallPersonalCenterChangeHeadUrlProto2 == 2004
    export interface GS2C_HallPersonalCenterChangeHeadUrl {
        Protocol: number,
        Protocol2: number,
        Status: number,// 验证码
    }

    //----------------------------------------------------------------------------------------------------------------------

    // 商品状态的结构
    export enum GoodsFlag {
        GoodsStateINIT = 0, // 商品状态
        News,                  // 新品
        Discount,              // 折扣
        Recommend,             // 推荐
        Hot,                   // 火
    }

    // 商品结构
    export interface ShopST {
        GoodsId: number,   // 商品配置Id
        GoodsName: string, // 商品的名字
        GoodsPrice: number,   // 商品的价格
        GoodsState: GoodsFlag,   // 商品的状态
        GoodsDiscount: number,   // 商品的折扣，1000倍
    }

    // 商城配置
    // C2GS_HallShopConfProto2 == 2005
    export interface C2GS_HallShopConf {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 用户唯一ID
    }

    // GS2C_HallShopConfProto2 == 2006
    export interface GS2C_HallShopConf {
        Protocol: number,
        Protocol2: number,
        GoodsInfo: ShopST[], // ShopST
    }

    // 点击购买
    // C2GS_HallShopBuyProto2 == 2007
    export interface C2GS_HallShopBuy {
        Protocol: number,
        Protocol2: number,
        OpenId: string,
        GoodsId: number,// 商品的配置ID
    }

    // GS2C_HallShopBuyProto2 == 2008
    export interface GS2C_HallShopBuy {
        Protocol: number,
        Protocol2: number,
        Coin: number,// 对应金币
    }

    //----------------------------------------------------------------------------------------------------------------------

    // 小游戏结构
    export interface SmallGameST {
        LatticeId: number,// 格子ID,ID=0开始
        Coin: number,// 金币数量
    }

    // 转盘小游戏
    // C2GS_HallMatkaGameProto2 == 2009
    export interface C2GS_HallMatkaGame {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 用户唯一ID
    }

    // GS2C_HallMatkaGameProto2
    export interface GS2C_HallMatkaGame {
        Protocol: number,
        Protocol2: number,
        LatticeInfo: SmallGameST[], // SmallGameST
    }

    // 点击抽奖
    // C2GS_MatkaGameLuckyDrawProto2
    export interface C2GS_MatkaGameLuckyDraw {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 玩家唯一ID
    }

    // GS2C_HallMatkaGameLuckyDrawProto2
    export interface GS2C_HallMatkaGameLuckyDraw {
        Protocol: number,
        Protocol2: number,
        LatticeId: number,// 格子ID,ID=0开始,数据更新
    }

    //----------------------------------------------------------------------------------------------------------------------
    // 签到的结构
    export interface SignInST {
        SignInId: number,// 签到的ID ,从0开始
        State: number,// 签到的状态，1：签到，2：未签到
        Coin: number,// 签到送的数量
    }

    // 签到7日,获取配置
    // C2GS_HallSignInProto2
    export interface C2GS_HallSignIn {
        Protocol: number,
        Protocol2: number,
        OpenId: string,
    }

    // GS2C_HallSignInProto2
    export interface GS2C_HallSignIn {
        Protocol: number,
        Protocol2: number,
        SignInInfo: SignInST[],
    }

    // 点击签到
    // C2GS_HallClickOnSignInProto2
    export interface C2GS_HallClickOnSignIn {
        Protocol: number,
        Protocol2: number,
        OpenId: string,
    }

    // GS2C_HallClickOnSignInProto2
    export interface GS2C_HallClickOnSignIn {
        Protocol: number,
        Protocol2: number,
        SignInId: number,// 签到的ID
    }

    //----------------------------------------------------------------------------------------------------------------------
    // 救济金
    // C2GS_HallClickOnJiuJiProto2
    export interface C2GS_HallClickOnJiuJi {
        Protocol: number,
        Protocol2: number,
        OpenId: string,
    }

    // GS2C_HallClickOnJiuJiProto2
    export interface GS2C_HallClickOnJiuJi {
        Protocol: number,
        Protocol2: number,
        State: number,// 1:已经领取过，2：未领取
        LeftTime: number,// 剩余时间，单位秒
    }

    // C2GS_HallClickOnGetJiuJiProto2
    export interface C2GS_HallClickOnGetJiuJi {
        Protocol: number,
        Protocol2: number,
        OpenId: string,
    }

    // GS2C_HallClickOnGetJiuJiProto2
    export interface GS2C_HallClickOnGetJiuJi {
        Protocol: number,
        Protocol2: number,
    }

    //----------------------------------------------------------------------------------------------------------------------
    //----------------------------------------------------------------------------------------------------------------------

    // C2GS_PlayerChooseCardsProto2
    export interface C2GS_PlayerChooseCards {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 玩家唯一ID
        RoomId: string, // 房间ID
        CardNum: number[],
    }

    // GS2C_PlayerChooseCardsProto2
    export interface GS2C_PlayerChooseCards {
        Protocol: number,
        Protocol2: number,
        CardNum: number[],
    }

    //----------------------------------------------------------------------------------------------------------------------
    interface UserStauct {
        Coin: number,
        HeadUrlID: number,
        OpenID: string,
        RoleUID: string,
        State: number,
        UserLev: number,
        UserName: string,
    }

    interface RoomConfST {
        ConfId:number,
        ConfName:string,
        BetMin: number,
    }

    // GS2C_EntrGameConifgRoomProto2  房间的配置
    export interface GS2C_EntrGameConifgRoom {
        Protocol: number,
        Protocol2: number,
        RoomList:  RoomConfST[]
    }
    // 房间内数据
    // 结算
    export interface SettleST {
        PosId: number,      // 位置从0:起点
        PaiInfo: number[],  // 牌的数据结构，就是数字就可以
        UserInfo: UserStauct, // 玩家的结构
        WinCoin: number,    //
    }

    // GS2C_PlayerSettleProto2
    export interface GS2C_PlayerSettle {
        Protocol: number,
        Protocol2: number,
        SettleInfo: SettleST[],
    }

    // C2GS_EntrGameProto2 == 进入游戏逻辑
    export interface C2GS_EntrGame {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 玩家唯一ID
        RoomType:number,// 对应配置的Id 应对GS2C_EntrGameConifgRoom.RoomList[].BetMin
    }

    export interface SeatInfo {
        GameState: number,
        IsRobot: boolean,
        PaiInfo: number[], // 牌信息
        PosId: number,   // 座位索引
        UserInfo: UserStauct,
    }
    export interface RoomST {
        RoomId: string,
        RoomState: number,
        TimeLeft: number,
        TurnId: number,
        WinPos: number,
        LastCards: [],
        PosInfo: SeatInfo[], // *SeatInfo
    }

    // 游戏开始fall
    // GS2C_EntrGameProto2  == 进入游戏
    export interface GS2C_EntrGame {
        Protocol: number,
        Protocol2: number,
        RoomInfo: RoomST //*RoomST
    }

    // C2GS_PlayerPlayCardsProto2
    export interface C2GS_PlayerPlayCards {
        Protocol: number,
        Protocol2: number,
        OpenId: string, // 玩家唯一ID
        RoomId: string, // 房间ID
        CardNum: number[],  // 数组形式
    }

    // GS2C_PlayerPlayCardsProto2  广播协议，状态机对应的结构数据信息
    export interface GS2C_PlayerPlayCards {
        Protocol: number,
        Protocol2: number,
        TurnId: number,   // 当前出牌的位置
        LastId: number,    // 是谁出牌
        CardNum: number[], // 数组形式
    }
};